
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JOptionPane;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Marcel
 */
public class TestePesquisa {
    
    public static void main(String[] args){
        int tamanho = 100000;
        Veiculo[] vetor = new Veiculo[tamanho];
        String[] placasPesq = new String[5];
        
        // geração dos dados
        String nome, placa, modelo;
        int ano;
        
        for (int i=0; i < vetor.length;i++){
            nome = GeradorAleatorio.geraNome()+" "+i;
            placa = GeradorAleatorio.geraPlaca();
            modelo = GeradorAleatorio.geraModelo();
            ano = GeradorAleatorio.geraAno();
            vetor[i] = new Veiculo(placa, modelo, ano, nome);
            //System.out.println(vetor[i]);
        }
        
        // identificação das placas a pesquisar posteriormente
        placasPesq[0] = "ZZZ-9999"; // para não ser localizado
        for (int i=1; i < placasPesq.length;i++){
            int pos = vetor.length/i - 1;
            placasPesq[i] = vetor[pos].getPlaca();
        }
        
        // criação das estruturas
        InterfaceExercicio5[] estruturas = new InterfaceExercicio5[3];
        estruturas[0] = new ListaPesquisaLinear();
        estruturas[1] = new ListaPesquisaBinaria();
        estruturas[2] = new ArvoreBinariaBusca();
        
                
        // calcule os tempos
        long inicio, fim;     
                
        // carga das estruturas
        for (int i=0; i < estruturas.length; i++){
            inicio = System.nanoTime();
            estruturas[i].addAll(vetor);
            fim = System.nanoTime();
            System.out.println("Teste addAll "+estruturas[i].getClass().getName()+" "+String.valueOf(fim-inicio));
        }
   
        //Testes de tempo lista Linear
        inicio = System.nanoTime();
        estruturas[0].addAll(vetor);
        fim = System.nanoTime();
        System.out.println("Teste addAll ListaLinear="+String.valueOf(fim-inicio));
        
        inicio = System.nanoTime();
        estruturas[0].pesquisa("ASD-3283");
        fim = System.nanoTime();
        System.out.println("Teste pesquisa ListaLinear="+String.valueOf(fim-inicio));
        
        inicio = System.nanoTime();
        estruturas[0].getMenorPlaca();
        fim = System.nanoTime();
        System.out.println("Teste menorPlaca ListaLinear="+String.valueOf(fim-inicio));
        
        inicio = System.nanoTime();
        estruturas[0].getMaiorPlaca();
        fim = System.nanoTime();
        System.out.println("Teste maiorPlaca ListaLinear="+String.valueOf(fim-inicio));
        
        inicio = System.nanoTime();
        estruturas[0].localizaMaisAntigo();
        fim = System.nanoTime();
        System.out.println("Teste localizaMaisAntigo ListaLinear="+String.valueOf(fim-inicio));
        
        //Testes de tempo Lista Binaria
        inicio = System.nanoTime();
        estruturas[1].pesquisa("ASD-3283");
        fim = System.nanoTime();
        System.out.println("Teste pesquisa ListaBinaria="+String.valueOf(fim-inicio));
        
        inicio = System.nanoTime();
        estruturas[1].getMenorPlaca();
        fim = System.nanoTime();
        System.out.println("Teste menorPlaca ListaBinaria="+String.valueOf(fim-inicio));
        
        inicio = System.nanoTime();
        estruturas[1].getMaiorPlaca();
        fim = System.nanoTime();
        System.out.println("Teste maiorPlaca ListaBinaria="+String.valueOf(fim-inicio));
        
        inicio = System.nanoTime();
        estruturas[1].localizaMaisAntigo();
        fim = System.nanoTime();
        System.out.println("Teste localizaMaisAntigo ListaBinaria="+String.valueOf(fim-inicio));

        
        //Testes de tempo arvore binaria
        inicio = System.nanoTime();
        estruturas[2].pesquisa("ASD-3283");
        fim = System.nanoTime();
        System.out.println("Teste pesquisa ArvoreBusca="+String.valueOf(fim-inicio));
        
        inicio = System.nanoTime();
        estruturas[2].getMenorPlaca();
        fim = System.nanoTime();
        System.out.println("Teste menorPlaca ArvoreBusca="+String.valueOf(fim-inicio));
        
        inicio = System.nanoTime();
        estruturas[2].getMaiorPlaca();
        fim = System.nanoTime();
        System.out.println("Teste maiorPlaca ArvoreBusca="+String.valueOf(fim-inicio));
        
        inicio = System.nanoTime();
        estruturas[2].localizaMaisAntigo();
        fim = System.nanoTime();
        System.out.println("Teste localizaMaisAntigo ArvoreBusca="+String.valueOf(fim-inicio));
        
        //teste dos métodos
        Veiculo[] vAntigo = estruturas[0].localizaMaisAntigo();
        
        Arrays.sort(vAntigo);
        System.out.println("Identificou "+vAntigo.length+" veículos mais antigos");
        Veiculo vMenor = estruturas[0].getMenorPlaca();
        System.out.println("Menor placa = "+vMenor);
        Veiculo vMaior = estruturas[0].getMaiorPlaca();
        System.out.println("Maior placa = "+vMaior);
        Veiculo veic;
        Veiculo[] vvAntigos;
        
        for (int i=1; i < estruturas.length; i++){
            vvAntigos = estruturas[i].localizaMaisAntigo();
            Arrays.sort(vvAntigos);
            if (!Arrays.equals(vAntigo, vvAntigos)){
                System.out.println("Antigos diferentes em "+estruturas[i].getClass().getName()+". Quantidade = "+vvAntigos.length);
            };
            veic = estruturas[i].getMenorPlaca();
            if (veic != vMenor){
                System.out.println("MENOR diferente em "+estruturas[i].getClass().getName()+" = "+veic);
            }
            veic = estruturas[i].getMaiorPlaca();
            if (veic != vMaior){
                System.out.println("MAIOR diferente em "+estruturas[i].getClass().getName()+" = "+veic);
            }            
        }

        // teste do método de pesquisa SEM sucesso
        for (int i=0; i < estruturas.length; i++){
                Veiculo v = estruturas[i].pesquisa(placasPesq[0]);
                if (v != null){
                    System.out.println("Problemas:"+estruturas[i].getClass().getName()+" localizou "+placasPesq[0]);
                }
        }
        // teste do método de pesquisa com sucesso
        for (int i=1; i < estruturas.length; i++){
            for (int p=0; p < placasPesq.length;p++){
                Veiculo v = estruturas[i].pesquisa(placasPesq[p]);
                if( v != null ){
                    if (!placasPesq[p].equals(v.getPlaca())){
                        System.out.println("Problemas:"+estruturas[i].getClass().getName()+": Pesquisado "+placasPesq[p]+" localizado "+v.getPlaca());
                    }
                }
            }
        }
    }
    
}

class GeradorAleatorio{
    
    private static String[] nomes = {"José","Maria","Pedro","João","Mario",
                                     "Paulo","Paula","Sandra","André","Carla"};
    private static String[] modelos = {"Gol","Uno","Fox","Fusca","C3","Fluence",
                                       "i30","Fiesta","Fit","Picanto"};
        
    private static int anoAtual = (new GregorianCalendar()).get(Calendar.YEAR);  

    public static String geraNome(){
        return nomes[geraNumero(10)];
    }

    public static String geraPlaca(){
        String placa="";
        for (int i=0; i < 3; i++){
            placa += (char)(65+geraNumero(26)); // ASCII 65 = A
        }
        placa += "-";
        for (int i=0; i < 4; i++){
            placa += (char)(48+geraNumero(10)); // ASCII 48 = 0
        }
        
        return placa;
    }
    
    public static String geraModelo(){
        return modelos[geraNumero(10)];        
    }
    
    public static int geraAno(){
        int redutor = geraNumero(10);
        if (redutor > 8){
            redutor = geraNumero(60);
        } else {
            redutor = geraNumero(20);
        }
        
        return anoAtual-redutor;
    }

    public static int geraNumero(int maximo){
        return (int)(Math.random()*maximo);
    }

}